# flask 中提供了一个flask 的 form，该表单其实和前端的差不多
# 实际上，完成网站的开发既可以是前端+后端，也可以是完全后端，这样就要求使用flask完成所有前端功能
# 为此，flask有众多的插件来完成，下面做一下前面做的登录，并且带验证码

import random
from flask import Flask, render_template, request
from wtforms.validators import DataRequired, EqualTo         # 验证密码非空，验证两次密码相等
from wtforms import StringField, PasswordField, SubmitField             # 表单的name、密码和提交
from flask_wtf import FlaskForm

app = Flask(__name__)
app.config["SECRET_KEY"] = str(random.random())

class RegisterForm(FlaskForm):
    # label 是flask_wtf 为 jinjia2封装好的变量
    user_name  = StringField(label="用户名", validators=[DataRequired("用户名不能为空")])
    password1 = PasswordField(label="密码", validators=[DataRequired("密码不能为空")])
    password2 = PasswordField(label="再次输入密码", validators=[DataRequired("密码不能为空"), EqualTo(password1, "两次密码必须相同")])
    submit = SubmitField(label="确定")


@app.route("/", methods=["GET", "POST"])
@app.route("/register", methods=["GET", "POST"])
def register():
    form  = RegisterForm()
    # 直接跑会报错，要求使用一个secre key来避免网站遭受到CSRF攻击，即跨站请求伪造的攻击手段
    # CSRF具体利用了web中用户身份验证的一个漏洞：简单的身份验证只能保证请求发自某个用户的浏览器，却不能保证请求本身是用户自愿发出的
    #  假如一家银行用以运行转账操作的URL地址如下：http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName
    # 那么，一个恶意攻击者可以在另一个网站上放置如下代码： <img src="http://www.examplebank.com/withdraw?account=Alice&amount=1000&for=Badman">
    # 如果有账户名为Alice的用户访问了恶意站点，而她之前刚访问过银行不久，登录信息尚未过期，那么她就会损失1000资金。
    # 问题的关键在于用户浏览器上保存的cookie
    # 解决办法就是在form中添加一个随机数，当用户点击submit的时候会把随机数一起提交，以实现验证，前面config里设置过了
    if request.method == "GET":
        return render_template("regist.html", form=form)
    elif request.method == "POST":
        # 使用验证器确保form中所有字段在提交的时候都通过了验证
        if  form.validate_on_submit():
            username = form.user_name.data
            password1 = form.password1.data
            password2 = form.password2.data
            print(password1, password2)
        return render_template("regist.html", form=form)
    else:
        return "False"

if __name__ == "__main__":
    app.run()